// support.js
class Container {
    static of(value) {
        return new Container(value)
    }
    constructor(value) {
        this._value = value
    }
    map(fn) {
        return Container.of(fn(this._value))
    }
}

class Maybe {
    static of(x) {
        return new Maybe(x)
    }
    isNothing() {
        return this._value === null || this._value === undefined
    }
    constructor(x) {
        this._value = x
    }
    map(fn) {
        return this.isNothing() ? this : Maybe.of(fn(this._value))
    }
}
module.exports = { Maybe, Container }

const fp = require('lodash/fp')

let maybe = Maybe.of([5, 6, 1])
let ex1 = arr => {
        return fp.map(fp.add(2), arr)
    }
    // console.log(maybe.map(ex1))


let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = arr => {
    return fp.first(arr)
}

// console.log(xs.map(ex2))


let safeProp = fp.curry(function(x, o) {
    return Maybe.of(o[x])
})
let user = { id: 2, name: 'Albert' }
let ex3 = user => {
    return safeProp('name', user).map(fp.first)
}

console.log(ex3(user))

let ex4 = function(n) {
    if (n) {
        return parseInt(n)
    }
}

let ex4g = n => {
    return Maybe.of(n).map(parseInt)
}

console.log(ex4g('456'))